import  pandas as pd
import  numpy as np
from sqlalchemy import  create_engine
from matplotlib import  pyplot as plt


class Analysis_Process():
    def __init__(self):
        #轻松入门大数据(2)：玩转Flink，打造湖仓一体架构,原价￥1299.00,中级,50小时,18,6
        self.columns=["title","price","level","timer","nums","score"]
        self.df = pd.DataFrame()
        self.engine = create_engine("mysql+pymysql://root:root@localhost:3306/moocdb?charset=utf8")  # 首先要创建jobdb库


    def read_data(self):
        self.df = pd.read_csv('mooc.log',sep=',',names=self.columns)

    '''
    数据处理，处理价格，处理时间
    '''
    def data_process(self):
        self.df['price'] = self.df['price'].apply(self.get_price)
        self.df['timer'] = self.df['timer'].apply(self.get_timer)
        #处理后的数据写入文件或mysql
        self.df.to_csv('mooc.csv',index=False)
        self.df.to_sql('mooc',self.engine,index=False,if_exists='replace')

    def data_analysis(self):
        data = pd.read_csv('mooc.csv',sep=',') #有标头不需要指定names
        #统计mooc数量
        cnt =data.shape[0]
        print('统计mooc总数量：',cnt)
        #统计学习人数前10的mooc,只显示标题与学习量
        top10 = data.sort_values(by='nums',ascending = False).iloc[0:10,[0,4]].reset_index(drop=True)
        top10.to_csv('top10.csv',index=False) #写入数据以做可视化
        #统计不同难度级别的学习人数，课程平均价格，平均学时
        d_g =  data.groupby(by='level').agg({'price':np.mean,'timer':np.average,'nums':np.sum}).reset_index()
        d_g['price'], d_g['timer']= np.round(d_g['price'],2),np.round(d_g['timer'],2)
        d_g.to_csv('mooc_level_group.csv',index=False) #写入数据以做可视化

    '''
    可视化
    '''
    def data_show(self):
        # 中文乱码处理
        plt.rcParams["font.sans-serif"] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
        # 创建画布
        plt.figure(figsize=(16, 8), dpi=75)
        plt.subplots_adjust(  hspace=0.5)  # 调整子图间距
        #子图方式显示
        plt.subplot(221)
        #显示学习人数前10的mooc,
        plt.title('学习人数前10的mooc')
        plt.xlabel('课程名称')
        plt.ylabel('学习人数')
        data = pd.read_csv('top10.csv', sep=',')  # 有标头不需要指定names
        plt.bar(data['title'].str[0:5],data['nums'])
        plt.xticks(rotation=45)
        for x, y in enumerate(data.iloc[:, 1]):
            plt.text(x, y + 0.2, y)


        plt.subplot(222)
        plt.title('不同等级课程平均价格')
        plt.xlabel('课程名称')
        plt.ylabel('平均价格')
        data = pd.read_csv('mooc_level_group.csv', sep=',')  # 有标头不需要指定names
        plt.barh(data['level'], data['price'],color='r')
        plt.xticks(rotation=45)
        for x, y in enumerate(data.iloc[:, 1]):
            plt.text(x, y + 0.2, y)

        plt.subplot(223)
        plt.title('不同等级课程平均时长')
        plt.xlabel('课程名称')
        plt.ylabel('平均时长')

        plt.plot(data['level'], data['timer'], color='b')
        plt.xticks(rotation=45)
        for x, y in enumerate(data.iloc[:, 2]):
            plt.text(x, y + 0.2, y)

        plt.subplot(224)
        plt.title('平均价格与学习人数关系')
        plt.xlabel('平均价格')
        plt.ylabel('学习人数')
        plt.scatter(data['price'], data['nums'], color='b')
        plt.show()

    '''
        处理时间，将小时，分钟转为秒数
    '''
    def get_timer(self,data):
        times=0
        if '小时' in data and '分钟' in data:
            split = [int(x.strip())  for x in  (data.replace('分钟','').split('小时'))]
            times = split[0]*60*60+split[1]*60
        else:
            times = int(data.replace('小时',''))*60*60

        return times


    '''
    处理价格
    '''
    def get_price(self,data):
        import  re
        v= re.search('\d+(\.\d+)?',data)
        return v.group()

if __name__ == '__main__':
    analysis =  Analysis_Process()
    analysis.read_data()
    #analysis.data_process()
    analysis.data_analysis()
    analysis.data_show()


